import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ThreadExample {
	public static void main(String[] args) throws InterruptedException {
		//yieldTest(); //yield使用测试
		joinTest(); //join使用测试
	}

	/**
	 *
	 */
	private static void joinTest() throws InterruptedException {
		// 使用了lambda表达式
		Thread thread = new Thread(() -> {
			for (int i = 1; i <= 6; i++) {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("子线程被执行第" + i + "次");
			}
		});
		// 开启线程
		thread.start();
		// 线程可以加入进去，加入进去的线程会比较优先，先执行。
		// 等到主线程被执行后，
		System.out.println("线程join 2S");
		thread.join(2000);
		for (int i = 1; i <= 4; i++) {
			Thread.sleep(1000);
			// 相对于 thread来说，main函数中执行的也是一个线程。
			System.out.println("主线程被执行第" + i + "次");
		}
	}

	/**
	 * yield()
	 * 执行程序后，发现，每次结果都不一样，
	 * 说明了调度器不一定会采纳我们的暗示（进而让当前线程让出调度权）
	 */
	private static void yieldTest() {
		Runnable runnable = new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 10; i++) {
					System.out.println("线程：" + Thread.currentThread().getName() + " I:" + i);
					if (i == 5) {
						// yield 会给出一个【愿意让出CPU使用权】的暗示，不过线程调度器可能也会忽略这个暗示。
						Thread.yield();
					}
				}
			}
		};
		Thread t1 = new Thread(runnable, "T1");
		Thread t2 = new Thread(runnable, "T2");
		t1.start();
		t2.start();
	}
}
